package com.thams.service;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import com.ibatis.common.jdbc.exception.RuntimeSQLException;
import com.thams.dao.base.DataBaseDao;

public abstract class DataBaseService {
	private static Logger log = Logger.getLogger(DataBaseService.class);
	@Autowired
	protected DataBaseDao dataBaseDao;

	/**
	 * 根据表名判断数据表是否存在
	 * @param tablename
	 * @return boolean
	 */
	protected boolean existTable(String tablename) throws DataAccessException{
		return dataBaseDao.existTable(tablename);
	}
	/**
	 * 判断表的字段是否存在
	 * @param tablename
	 * @return boolean
	 */
	public boolean existColumn(String tablename,String columnName) throws DataAccessException{
		return dataBaseDao.existColumn(tablename,columnName);
	}
//	/**
//	 * 生成insert语句
//	 * @param tablename
//	 * @return
//	 */
//	public String generateInsertSQL(String tablename){
//		return dataBaseDao.generateInsertSQL(tablename);
//	}
	/**
	 * 根据表字段是否可以为空 如果为空返回true 否则false
	 * @param tablename
	 * @return boolean
	 */
	public boolean validateColumnIsNULL(String tablename,String columnName) throws DataAccessException{
		return dataBaseDao.validateColumnIsNULL(tablename, columnName);
	}
	
	/**
	 * 执行insert语句
	 * @param executeInsertSQL sql语句
	 */
	protected void executeInsertSQL(String executeInsertSQL) throws DataAccessException{
		dataBaseDao.executeInsertSQL(executeInsertSQL);
	}
	/**
	 * 更新表结构,执行更新删除语句
	 * @param alterTableSQL sql语句
	 */
	protected void executeSQL(String executeSQL) throws DataAccessException{
		dataBaseDao.executeSQL(executeSQL);
	}
	/**
	 * 查询语句 select max min 
	 * @param executeQuerySQL
	 * @return sql执行后的返回对象
	 */
	protected Object executeQuerySQL(String executeQuerySQL) throws DataAccessException{
		return dataBaseDao.executeQuerySQL(executeQuerySQL);
	}
	/**
	 * 查询语句 返回单个对象Map
	 * @param executeQuerySQL
	 * @return sql执行后的返回对象
	 */
	protected Map executeQueryMapSQL(String executeQueryMapSQL) throws DataAccessException{
		return dataBaseDao.executeQueryMapSQL(executeQueryMapSQL);
	}
	/**
	 * 执行传入的SQL返回一个List<Map>
	 * @param executeQuerySQL
	 * @return sql执行后的返回对象
	 */
	protected List<Map> executeQuerySQLResultList(String executeQuerySQL) throws DataAccessException{
		return dataBaseDao.executeQuerySQLResultList(executeQuerySQL);
	}
	/**
	 * 执行传入的SQL返回一个List<Map> 可以分页
	 * @param executeQuerySQL
	 * @return sql执行后的返回对象
	 */
	protected List<Map> executeQuerySQLResultListPage(String executeQuerySQL ,String primaryKey,String orderBy, Integer pageNumber, Integer pageSize) throws DataAccessException{
		return dataBaseDao.executeQuerySQLResultListPage(executeQuerySQL ,primaryKey,orderBy, pageNumber, pageSize);
	}
	/**
	 * 判断是否oracle数据库
	 * @return true
	 */
	protected boolean isOracle(){
		boolean b = false;
		try {
			b = getDatabaseType().equals("Oracle");
		} catch (Exception e) {
			log.error(e.getMessage());
		}
		return b;
	}
	/**
	 * 判断是否Db2数据库
	 * @return true
	 */
	protected boolean isDb2(){
		boolean b = false;
		try {
			b = getDatabaseType().equals("Db2");
		}catch (Exception e) {
			log.error(e.getMessage());
		}
		return b;
	}
	/**
	 * 判断是否MSSQL数据库
	 * @return true
	 */
	protected boolean isMssql(){
		boolean b = false;
		try {
			b = getDatabaseType().equals("Microsoft SQL Server");
		} catch (Exception e) {
			log.error(e.getMessage());
		}
		return b;
	}
	/**
	 * 代表数据库类型的子串
	 * @return
	 */
	public String getDatabaseType(){
		String databaseType = "";
		try {
			databaseType = (String) dataBaseDao.getDBInfo().get("databaseType");
		} catch (RuntimeSQLException e) {
			log.error(e.getMessage());
		} catch (SQLException e) {
			log.error(e.getMessage());
		}
		return databaseType;
	}
	/**
	 * 获取格式化后的数据库时间 yyyy-MM-dd HH:mm:ss www 格式
	 * @return
	 */
	protected String getDatabaseTimeToStr(){
		Date databaseTime = null;
		String result = null;
		try {
			databaseTime = getDatabaseTimeToDate();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			result = sdf.format(databaseTime);
		} catch (Exception e) {
			log.error(e.getMessage());
		} 
		return result;
	}
	/**
	 * 转换对象到Integer对象
	 * @param obj
	 * @return
	 */
	protected Integer convertIntegerFromObject(Object obj){
		try {
			if(obj != null){
				return Integer.parseInt(obj.toString());
			}else{
				return null;
			}
		} catch (Exception e) {
			return null;
		}
	}
	
	/**
	 * 获取未格式化的数据库时间 Date格式
	 * @return
	 */
	protected Date getDatabaseTimeToDate(){
		Date datetime = null;
		try {
			datetime = (Date) dataBaseDao.getDBInfo().get("databaseTime");
		} catch (RuntimeSQLException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return datetime;
	}
	
	/**
	 * 根据表名获取最大DID值
	 * @param tableName 表名
	 */
	protected Integer getMaxDidByTableName(String tableName) throws DataAccessException{
		return dataBaseDao.getMaxDidByTableName(tableName);
	}
	/**
	 * 根据表名获取字段的最大值
	 * @param tableName 表名
	 * @param maxField 要取最大值的字段名
	 */
	protected Integer getMaxFieldByTableName(String tableName,String maxField) throws DataAccessException{
		return dataBaseDao.getMaxFieldByTableName(tableName,maxField);
	}
	
	/**
	 * 写入数据库的当前时间 .按数据库类型区分返回
	 * @return SYSDATE
	 */
	protected String toDateBaseTime(){
		TimeZone.setDefault(TimeZone.getTimeZone("ETC/GMT-8"));  //设置时区 中国/北京/香港
		if(isOracle()){
			return "SYSDATE";
		}else if(isDb2()){
			return "CURRENT TIMESTAMP";
		}else{
			return "GETDATE()";
		}
	}
	
	/**
	 * 自定义时间格式.传入 解析成数据库接受方言
	 * @param date String 或者 Date 类型
	 * @return TODATE(**)
	 */
	protected String generateTimeToSQLDate(Object date){
		TimeZone.setDefault(TimeZone.getTimeZone("ETC/GMT-8"));  //设置时区 中国/北京/香港
		String datevalue = null;
		if(date instanceof Date){
			Date datetime = (Date)date;
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			datevalue = sdf.format(datetime);
		}
		if(date instanceof String){
			datevalue = (String)date;
		}
		if(isOracle()){ //如果是oracle数据库
			return "TO_DATE('"+datevalue+"', 'yyyy-MM-dd HH24:mi:ss')";
		}else if(isDb2()){
			return "TIMESTAMP('" + datevalue + "' )";
		}else{
			return "cast('" + datevalue + "' as datetime)";
		}
	}
	
	
	/**
	 * 拼装DID
	 * @param dids
	 * @return
	 */
	protected String spellingDID(Object[] dids){
		String str = "";
		for (Object d : dids) {
			str +=","+d;
		}
		return str.replaceFirst(",", "");
	}

}
